#ifndef CIRCULAR_BUFFER_H
#define CIRCULAR_BUFFER_H


#include <stdint.h>
#include <string.h>
#include <stdbool.h>
// 定义缓冲区大小（可根据需要修改）
#define CIRCULAR_BUFFER_SIZE 12

// 结构体定义
typedef struct {
    uint8_t buffer[CIRCULAR_BUFFER_SIZE];     // 内部存储数组
    uint8_t* bufferEnd;                       // 指向 buffer[capacity - 1]
    uint8_t* writeP;                          // 写指针（当前写入位置）
    uint8_t* readP;                           // 读指针（当前读取位置）
} CircularBuffer;

// 函数声明

/**
 * @brief 初始化
 * @param cb 循环缓冲区指针
 */
void CircularBuffer_Init(CircularBuffer* cb);
void CircularBuffer_Clear(CircularBuffer* cb);

/**
 * @brief 数据长度
 * @param cb 循环缓冲区指针
 * @return 已存储的数据长度
 */
size_t CircularBuffer_Size(const CircularBuffer* cb);

/**
 * @brief 最大容量
 * @param cb 循环缓冲区指针
 * @return 最大容量
 */
size_t CircularBuffer_Capacity(const CircularBuffer* cb);

/**
 * @brief 是否为空
 * @param cb 循环缓冲区指针
 * @return true 是
 * @return false 否
 */
bool CircularBuffer_Empty(const CircularBuffer* cb);

/**
 * @brief 数据区开头
 * @param cb 循环缓冲区指针
 * @return 数据区开头指针
 */
uint8_t* CircularBuffer_Begin(const CircularBuffer* cb);

/**
 * @brief 数据区结尾
 * @param cb 循环缓冲区指针
 * @return 数据区结尾指针
 */
uint8_t* CircularBuffer_End(const CircularBuffer* cb);

/**
 * @brief 向缓冲区追加数据
 * @param cb 循环缓冲区指针
 * @param data 数据
 * @param length 数据长度
 * @return true 成功
 * @return false 失败
 */
bool CircularBuffer_Append(CircularBuffer* cb, const uint8_t* data, size_t length);

/**
 * @brief 从缓冲区消费数据
 * @param cb 循环缓冲区指针
 * @param data 数据
 * @param length 数据长度
 * @return true 成功
 * @return false 失败 
 */
bool CircularBuffer_Consume(CircularBuffer* cb, uint8_t* rBuffer, size_t length);

/**
 * @brief 删除指针前的所有数据
 * @param cb 循环缓冲区指针
 * @param it 一个指向数据区结尾指针
 * @return true 成功
 * @return false 失败
 */
bool CircularBuffer_EraseFront(CircularBuffer* cb, uint8_t* it);

/**
 * @brief 查找特定数据
 * @param cb 循环缓冲区指针
 * @param target 目标
 * @param length 目标长度
 * @return NULL 没有找到
 * @return 找到的目标指针
*/
uint8_t* CircularBuffer_Find(CircularBuffer* cb, const uint8_t* target, size_t length);



#endif // CIRCULAR_BUFFER_H